Ember.js Services হল একটি বিশেষ ধরনের JavaScript object যা অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে শেয়ারযোগ্য ডেটা বা ফাংশনালিটি প্রদান করে। Services সাধারণত Singleton হিসেবে কাজ করে, অর্থাৎ একবার তৈরি হলে পুরো অ্যাপ্লিকেশনে একই ইনস্ট্যান্স ব্যবহার করা হয়। এই কারণে Services কম্পোনেন্ট, রাউট, কন্ট্রোলার ইত্যাদির মধ্যে শেয়ার করা ডেটা বা লজিক পরিচালনা করতে ব্যবহৃত হয়।
Ember.js Services আপনাকে কেন্দ্রীয় অবস্থান থেকে ডেটা পরিচালনা এবং বিশ্বব্যাপী অ্যাপ্লিকেশন স্টেট শেয়ার করার সুযোগ দেয়, যা অ্যাপ্লিকেশন কোড সহজ, রক্ষণাবেক্ষণযোগ্য এবং স্কেলেবল করে তোলে।
Ember.js Service তৈরি করা
Ember.js-এ একটি Service তৈরি করার জন্য Ember CLI ব্যবহার করা হয়। ember generate service কমান্ডের মাধ্যমে নতুন Service তৈরি করা যেতে পারে।
Service তৈরি করতে:
ember generate service user-auth
এটি app/services/user-auth.js ফাইল তৈরি করবে, যেখানে user-auth সেবা সম্পর্কিত কোড থাকবে। এই Service-টি অ্যাপ্লিকেশনের বিভিন্ন অংশে শেয়ার করা যাবে।
Ember.js Service কনফিগারেশন
একটি Service সাধারণত একটি JavaScript class বা object এর মতো কাজ করে, যার মধ্যে ডেটা এবং মেথড থাকে যা বিভিন্ন কম্পোনেন্ট বা রাউট দ্বারা ব্যবহৃত হতে পারে।
Service উদাহরণ:
// app/services/user-auth.js
import Service from '@ember/service';
export default class UserAuthService extends Service {
isAuthenticated = false; // ইউজারের লগইন স্টেট
username = ''; // লগইন হওয়া ইউজারের নাম
login(username) {
this.set('isAuthenticated', true);
this.set('username', username);
}
logout() {
this.set('isAuthenticated', false);
this.set('username', '');
}
}
ব্যাখ্যা:
- State: এখানে,
isAuthenticatedএবংusernameহল সেই ডেটা যা আমরা Service তে রাখছি, এবং অন্য যেকোনো কম্পোনেন্ট বা রাউট থেকে এক্সেস করা যাবে। - Methods:
login()এবংlogout()মেথডগুলোর মাধ্যমে আমরা ইউজারের লগইন এবং লগআউট সম্পর্কিত কার্যকলাপ পরিচালনা করতে পারি। - Singleton: Ember Service একবার তৈরি হলে এটি অ্যাপ্লিকেশনের অন্যান্য অংশে Shared instance হিসেবে ব্যবহৃত হয়, যা অ্যাপ্লিকেশনের অন্যান্য কম্পোনেন্টে একই স্টেট শেয়ার করতে সহায়ক।
Service ব্যবহার করা
Ember.js-এ Service ব্যবহার করতে, inject মেথড ব্যবহার করা হয়, যা Service ইনজেক্ট করে এবং অ্যাপ্লিকেশনের যে কোন অংশে সেই Service-এর ডেটা বা মেথড ব্যবহার করতে দেয়।
Service ইনজেক্ট করা
- কম্পোনেন্টে Service ইনজেক্ট করা:
// app/components/login-form.js
import Component from '@ember/component';
import { inject } from '@ember/service';
export default class LoginFormComponent extends Component {
@inject('user-auth') userAuth; // user-auth service ইনজেক্ট করা
login() {
this.userAuth.login('john_doe');
alert('Logged in as ' + this.userAuth.username);
}
}
- রাউটে Service ইনজেক্ট করা:
// app/routes/application.js
import Route from '@ember/routing/route';
import { inject } from '@ember/service';
export default class ApplicationRoute extends Route {
@inject('user-auth') userAuth; // user-auth service ইনজেক্ট করা
beforeModel() {
if (!this.userAuth.isAuthenticated) {
this.transitionTo('login'); // ইউজার যদি লগইন না থাকে, তাহলে লগইন পেজে রিডাইরেক্ট করা হবে
}
}
}
- কন্ট্রোলারে Service ইনজেক্ট করা:
// app/controllers/application.js
import Controller from '@ember/controller';
import { inject } from '@ember/service';
export default class ApplicationController extends Controller {
@inject('user-auth') userAuth; // user-auth service ইনজেক্ট করা
get isAuthenticated() {
return this.userAuth.isAuthenticated;
}
}
Service এর অন্যান্য ব্যবহারের ক্ষেত্র
- গ্লোবাল ডেটা শেয়ার: আপনি যদি অ্যাপ্লিকেশন এর বিভিন্ন অংশে কিছু গ্লোবাল ডেটা শেয়ার করতে চান, যেমন ইউজার প্রোফাইল, থিম সেটিংস বা ভাষা পছন্দ, তবে Service ব্যবহার করা যেতে পারে।
- API কল পরিচালনা: API কল করা এবং তার ফলাফল সার্ভিসে স্টোর করা। এতে সার্ভিসের ডেটা অ্যাপ্লিকেশনের বিভিন্ন অংশে ব্যবহৃত হতে পারে।
- অথেনটিকেশন এবং অথোরাইজেশন: ইউজারের লগইন এবং লগআউট পরিচালনা করার জন্য একটি
user-authসার্ভিস ব্যবহার করা যেতে পারে, যেটি আপনার অ্যাপ্লিকেশনের বিভিন্ন রাউট বা কম্পোনেন্টে শেয়ার করা যাবে। - ইভেন্ট হ্যান্ডলিং: কোনো ইভেন্ট বা অ্যাকশন পরিচালনার জন্য সার্ভিস ব্যবহার করা যেতে পারে, যেমন মোবাইল ডিভাইসের সাথে যোগাযোগ স্থাপন বা পুশ নোটিফিকেশন পাঠানো।
Ember.js Service এর সুবিধা
- স্টেট শেয়ারিং: Service ব্যবহার করে অ্যাপ্লিকেশনের যেকোনো অংশের মধ্যে ডেটা বা স্টেট শেয়ার করা যায়।
- সিঙ্গলটন প্যাটার্ন: Service সাধারণত Singleton হিসেবে কাজ করে, অর্থাৎ একবার তৈরি হলে একে অ্যাপ্লিকেশনের অন্য অংশে পুনরায় ব্যবহৃত করা যায়।
- কেন্দ্রীয় অবস্থান থেকে ডেটা ম্যানেজমেন্ট: Service অ্যাপ্লিকেশনের কেন্দ্রীয় স্থান থেকে ডেটা পরিচালনা করতে সক্ষম করে, যা রক্ষণাবেক্ষণ সহজ করে তোলে।
- কোড পুনঃব্যবহারযোগ্যতা: Service কম্পোনেন্ট এবং রাউটগুলির মধ্যে কোড পুনঃব্যবহারযোগ্যতা নিশ্চিত করে, এবং বড় অ্যাপ্লিকেশনে সেগুলি সংগঠিত রাখে।
Ember.js Services অ্যাপ্লিকেশন ডেভেলপমেন্টে অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে, কারণ এটি স্টেট এবং ফাংশনালিটি শেয়ার করতে সাহায্য করে। Services একটি কেন্দ্রীয় অবস্থান থেকে ডেটা পরিচালনা করতে সক্ষম, এবং এতে অ্যাপ্লিকেশনের মধ্যে কোড পুনঃব্যবহারযোগ্যতা, সিঙ্গলটন প্যাটার্ন এবং গ্লোবাল ডেটা শেয়ারিং সুবিধা পাওয়া যায়।
Ember.js-এ Service একটি বিশেষ ধরনের JavaScript ক্লাস যা অ্যাপ্লিকেশনের মধ্যে শেয়ারযোগ্য এবং দীর্ঘমেয়াদী (long-lived) স্টেট এবং কার্যকলাপ পরিচালনা করতে ব্যবহৃত হয়। এটি এক বা একাধিক কম্পোনেন্ট, কন্ট্রোলার, বা রাউটের মধ্যে পুনঃব্যবহারযোগ্য ডেটা এবং কার্যকলাপ সরবরাহ করতে সহায়ক।
Services সাধারণত ব্যবহারকারীর প্রমাণীকরণ তথ্য, সেন্সর ডেটা, লজিকাল অপারেশন, অথবা অ্যাপ্লিকেশন স্তরের শেয়ারযোগ্য ডেটা পরিচালনা করতে ব্যবহৃত হয়। Service গুলো Ember-এর ডিপেন্ডেন্সি ইনজেকশন (DI) সিস্টেমের মাধ্যমে সারা অ্যাপ্লিকেশন জুড়ে ইনজেক্ট করা যায়, যা ডেটার সহজ প্রবাহ এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
Service কী এবং কেন ব্যবহৃত হয়?
Service হল একটি ক্লাস যা অ্যাপ্লিকেশনের মধ্যে শেয়ারযোগ্য ডেটা বা লজিক পরিচালনা করে। এটি একাধিক কম্পোনেন্ট, কন্ট্রোলার, এবং রাউটের মধ্যে শেয়ার করা যেতে পারে। এটি সাধারণত স্টেটফুল হয়, যা সারা অ্যাপ্লিকেশন জুড়ে একটি নির্দিষ্ট স্টেট বজায় রাখতে সহায়ক।
কেন Service ব্যবহৃত হয়?
- শেয়ারযোগ্য ডেটা এবং লজিক: একাধিক কম্পোনেন্ট বা রাউটের মধ্যে সাধারণ ডেটা বা কার্যকলাপ শেয়ার করতে।
- ব্যবহারকারী প্রমাণীকরণ: ব্যবহারকারী লগইন বা লগআউট স্টেট যেমন, টোকেন বা সেশন তথ্য শেয়ার করার জন্য।
- ডেটা ক্যাশিং: API থেকে প্রাপ্ত ডেটা ক্যাশে সংরক্ষণ এবং একাধিক রাউটে ব্যবহার করার জন্য।
- পুনঃব্যবহারযোগ্য ফাংশনালিটি: একই কার্যকলাপ বিভিন্ন স্থান থেকে পুনঃব্যবহার করার জন্য।
Service কিভাবে কাজ করে?
Service তৈরি করতে আপনাকে Ember Service API ব্যবহার করতে হবে, যা Ember.js অ্যাপ্লিকেশনের অন্যান্য অংশের সাথে সহজে কাজ করতে সহায়ক।
১. Service তৈরি করা
Ember CLI ব্যবহার করে আপনি একটি Service তৈরি করতে পারেন:
ember generate service user-auth
এটি app/services/user-auth.js ফাইল তৈরি করবে:
// app/services/user-auth.js
import Service from '@ember/service';
export default class UserAuthService extends Service {
isAuthenticated = false;
login() {
this.isAuthenticated = true;
console.log('User logged in');
}
logout() {
this.isAuthenticated = false;
console.log('User logged out');
}
getAuthStatus() {
return this.isAuthenticated;
}
}
এখানে, UserAuthService একটি সাধারণ Service যা ব্যবহারকারীর লগইন এবং লগআউট স্টেট পরিচালনা করে।
২. Service ইনজেকশন
Ember-এর dependency injection (DI) সিস্টেম ব্যবহার করে Service গুলো অ্যাপ্লিকেশনের বিভিন্ন অংশে ইনজেক্ট করা হয়। আপনি Service গুলো কম্পোনেন্ট, কন্ট্রোলার, বা রাউটে ইনজেক্ট করতে পারেন।
// app/routes/application.js
import Route from '@ember/routing/route';
export default class ApplicationRoute extends Route {
// Service ইনজেক্ট করা
@inject('user-auth') userAuth;
model() {
// Service থেকে ডেটা নেওয়া
return { isAuthenticated: this.userAuth.getAuthStatus() };
}
}
এখানে @inject('user-auth') ব্যবহার করে user-auth Service রাউটের মধ্যে ইনজেক্ট করা হয়েছে এবং model() মেথডে getAuthStatus() ব্যবহার করে সেই Service থেকে ডেটা নেয়া হচ্ছে।
৩. Service ব্যবহার করা
একটি কম্পোনেন্টে Service ব্যবহার করতে:
// app/components/login-status.js
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
export default class LoginStatusComponent extends Component {
@service('user-auth') userAuth;
get loginStatus() {
return this.userAuth.getAuthStatus() ? 'Logged in' : 'Logged out';
}
}
এখানে, user-auth Service কম্পোনেন্টে ইনজেক্ট করা হয়েছে এবং getAuthStatus() ব্যবহার করে লগইন স্টেট চেক করা হচ্ছে। loginStatus গেটার মাধ্যমে UI-তে স্টেট শো করা হচ্ছে।
৪. Service এর লাইফসাইকেল
Ember Services গুলি singleton হিসেবে কাজ করে, অর্থাৎ এগুলি একবার তৈরি হলে সারা অ্যাপ্লিকেশনে একই ইনস্ট্যান্স শেয়ার করা হয়। এর মানে হল যে একটি Service সবার জন্য শেয়ার করা হয়, এবং এটি প্রজেক্টের যে কোনো স্থান থেকে এক্সেস করা যাবে।
৫. Service ব্যবহারের উদাহরণ
একটি cart Service তৈরি করা:
ember generate service cart
app/services/cart.js:
import Service from '@ember/service';
export default class CartService extends Service {
items = [];
addItem(item) {
this.items.push(item);
}
removeItem(item) {
this.items = this.items.filter(cartItem => cartItem !== item);
}
getItems() {
return this.items;
}
}
এটি একটি cart Service তৈরি করবে যা items অ্যারের মধ্যে প্রোডাক্ট যোগ এবং সরানোর কাজ করবে।
app/components/cart.js:
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
export default class CartComponent extends Component {
@service('cart') cart;
get items() {
return this.cart.getItems();
}
addItemToCart(item) {
this.cart.addItem(item);
}
removeItemFromCart(item) {
this.cart.removeItem(item);
}
}
এখানে, cart Service কম্পোনেন্টে ইনজেক্ট করা হয়েছে এবং addItem ও removeItem ফাংশন ব্যবহার করে প্রোডাক্ট যোগ এবং সরানো হচ্ছে।
Service এর সুবিধা
- শেয়ারযোগ্যতা: Services গুলো অ্যাপ্লিকেশন জুড়ে পুনঃব্যবহারযোগ্য এবং একাধিক অংশের মধ্যে শেয়ার করা যায়।
- দীর্ঘমেয়াদী স্টেট: Services দীর্ঘমেয়াদী স্টেট (long-lived state) পরিচালনা করতে সক্ষম।
- ডিপেন্ডেন্সি ইনজেকশন: Services-কে সহজে অন্য কম্পোনেন্ট, কন্ট্রোলার বা রাউটের মধ্যে ইনজেক্ট করা যায়।
- কাস্টম লজিক: Service গুলোর মধ্যে অ্যাপ্লিকেশনের বিশেষ কার্যকলাপ (ব্যবহারকারী প্রমাণীকরণ, ডেটা ক্যাশিং, ইত্যাদি) সংরক্ষণ করা যায়।
Ember.js Services অ্যাপ্লিকেশনের মধ্যে পুনঃব্যবহারযোগ্য, শেয়ারযোগ্য, এবং দীর্ঘমেয়াদী স্টেট পরিচালনা করার জন্য একটি শক্তিশালী উপায়। এটি ডিপেন্ডেন্সি ইনজেকশন সিস্টেমের মাধ্যমে অ্যাপ্লিকেশনের বিভিন্ন অংশে সহজেই ইনজেক্ট করা যায়। এটি ডেটা ক্যাশিং, ব্যবহারকারী প্রমাণীকরণ, লগিং এবং অন্যান্য শেয়ারযোগ্য কার্যকলাপ পরিচালনা করতে সহায়ক। Service ব্যবহার করে Ember.js অ্যাপ্লিকেশন ডেভেলপমেন্ট আরও শক্তিশালী, পরিষ্কার এবং কার্যকরী হয়।
Ember.js Services হল একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা অ্যাপ্লিকেশনের শেয়ারযোগ্য এবং পুনঃব্যবহারযোগ্য লজিক এবং ডেটা পরিচালনা করতে ব্যবহৃত হয়। Services ডেটা স্টোরেজ, ইউজার অথেন্টিকেশন, শেয়ারযোগ্য স্টেট ম্যানেজমেন্ট, এবং অন্যান্য কাজের জন্য ব্যবহৃত হয় যা একাধিক কম্পোনেন্ট বা রাউট দ্বারা প্রয়োজন হতে পারে। Services সাধারণত অ্যাপ্লিকেশনটির global state সংরক্ষণ এবং শেয়ার করতে ব্যবহৃত হয়।
Ember.js Service এর গঠন
Service তৈরি করা হয় JavaScript ক্লাসের মাধ্যমে, এবং এটি সাধারণত অ্যাপ্লিকেশন স্তরে একবার ইনস্ট্যান্সিয়েট হয়, তাই এটি একাধিক কম্পোনেন্ট এবং রাউটের মধ্যে শেয়ার করা যায়।
Service তৈরি করা
Ember CLI ব্যবহার করে সহজেই Service তৈরি করা যায়:
ember generate service user-auth
এটি একটি user-auth নামের service তৈরি করবে এবং app/services/user-auth.js ফাইলে তার কার্যাবলী সংজ্ঞায়িত করবে।
Service Example
// app/services/user-auth.js
import Service from '@ember/service';
export default class UserAuthService extends Service {
isAuthenticated = false; // স্টেট যা ইউজারের অথেন্টিকেশন চেক করবে
login() {
this.set('isAuthenticated', true);
console.log('User logged in');
}
logout() {
this.set('isAuthenticated', false);
console.log('User logged out');
}
}
এখানে:
- isAuthenticated: এটি ইউজারের লগইন অবস্থাকে ট্র্যাক করে।
- login() এবং logout(): এগুলি ইউজারের লগইন এবং লগআউটের জন্য ব্যবহৃত অ্যাকশন।
Service ফাইলের স্ট্রাকচার
// app/services/user-auth.js
import Service from '@ember/service';
export default class UserAuthService extends Service {
// এখানে বিভিন্ন মেথড এবং প্রপার্টি থাকতে পারে
}
Service ব্যবহার করা
Service ব্যবহার করতে হলে, আপনি অ্যাপ্লিকেশনের যে অংশে এটি প্রয়োজন সেখানে এটি ইনজেক্ট করতে পারেন। সাধারণত, এটি Controller, Route, অথবা Component-এ ইনজেক্ট করা হয়।
Service ইনজেক্ট করা
- Controller-এ Service ইনজেক্ট করা:
// app/controllers/application.js
import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
export default class ApplicationController extends Controller {
@service userAuth; // user-auth service ইনজেক্ট করা
login() {
this.userAuth.login(); // service এর মেথড কল করা
}
}
- Component-এ Service ইনজেক্ট করা:
// app/components/user-login.js
import Component from '@ember/component';
import { inject as service } from '@ember/service';
export default class UserLoginComponent extends Component {
@service userAuth;
actions: {
login() {
this.userAuth.login();
},
logout() {
this.userAuth.logout();
}
}
}
এখানে, @service ডেকোরেটর ব্যবহার করে userAuth service ইনজেক্ট করা হয়েছে এবং তার মেথডগুলি ব্যবহার করা হয়েছে।
- Route-এ Service ইনজেক্ট করা:
// app/routes/application.js
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
export default class ApplicationRoute extends Route {
@service userAuth;
model() {
return {
isAuthenticated: this.userAuth.isAuthenticated,
};
}
}
এখানে userAuth service এর isAuthenticated স্টেট model() ফাংশনের মাধ্যমে রাউটে প্রেরণ করা হয়েছে।
Service এর সুবিধা
- Shared State: Service গুলো একাধিক কম্পোনেন্ট এবং রাউটের মধ্যে শেয়ার করা যায়, যা একই ডেটা একাধিক জায়গায় ব্যবহারের সুবিধা দেয়।
- Global Scope: Services অ্যাপ্লিকেশনের জন্য একটি গ্লোবাল স্কোপে কাজ করে, যার মানে এটি একবার তৈরি হলে যেকোনো জায়গায় ব্যবহৃত হতে পারে।
- Reusable Logic: একাধিক কম্পোনেন্টে বা রাউটে একই লজিক ব্যবহার করার সুবিধা দেয়। উদাহরণস্বরূপ, ইউজার অথেন্টিকেশন লজিক একবার একটি Service-এ রাখা যেতে পারে এবং তা অ্যাপ্লিকেশনের সব জায়গায় ব্যবহার করা যেতে পারে।
Service Lifecycle
- Singleton Pattern: Ember Services সাধারণত একবার তৈরি হয় এবং পুরো অ্যাপ্লিকেশন জুড়ে একক ইনস্ট্যান্স হিসেবে ব্যবহৃত হয়।
- Injected into components, routes, and controllers: একটি Service একাধিক জায়গায় ইনজেক্ট করা যেতে পারে এবং একই ইনস্ট্যান্স ব্যবহার করা হয়।
- State Persistence: Services সাধারণত অ্যাপ্লিকেশনের চলমান অবস্থায় স্টেট ধরে রাখে। একবার ইনস্ট্যান্স তৈরি হলে, সেটি চলতি রাউট বা কম্পোনেন্টের ভিতর বা বাইরে যেকোনো সময় ব্যবহৃত হতে পারে।
Service এবং Dependency Injection (DI)
Ember.js-এ Dependency Injection (DI) ব্যবহৃত হয়, যা সিস্টেমের মধ্যে নির্দিষ্ট একটি কম্পোনেন্ট বা সেবা প্রদান করা হয়। DI ব্যবহারের মাধ্যমে আপনি একাধিক জায়গায় একই সেবা/কম্পোনেন্ট ব্যবহার করতে পারেন এবং এটি প্রজেক্টের রক্ষণাবেক্ষণ সহজ করে তোলে। Ember CLI এর মাধ্যমে Service ইনজেক্ট করা হয় DI সিস্টেমের মাধ্যমে।
Service-এর অন্যান্য ফিচার
- অ্যাপ্লিকেশন স্টেট:
- আপনি একাধিক কম্পোনেন্ট বা রাউটের মধ্যে শেয়ার করার জন্য অ্যাপ্লিকেশন স্টেট রাখতে পারবেন।
- Lazy Loading:
- Ember.js Services সাধারণত lazy-loaded হয়, অর্থাৎ সেগুলি যখন প্রয়োজন হয় তখনই ইনস্ট্যান্সিয়েট হয়। এটি অ্যাপ্লিকেশনের কর্মক্ষমতা বৃদ্ধি করতে সহায়ক।
Ember.js Services হল একটি অত্যন্ত শক্তিশালী ফিচার যা অ্যাপ্লিকেশনের শেয়ারযোগ্য লজিক এবং ডেটা পরিচালনা করতে ব্যবহৃত হয়। এটি অ্যাপ্লিকেশনের মধ্যে পুনঃব্যবহারযোগ্য এবং এককভাবে পরিচালিত কোড লেখা সহজ করে তোলে। একবার তৈরি হলে, Services বিভিন্ন কম্পোনেন্ট এবং রাউটের মধ্যে শেয়ার করা যায় এবং অ্যাপ্লিকেশনের জটিল লজিক সুশৃঙ্খলভাবে রাখা যায়।
Services হল Ember.js এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে ডেটা এবং লজিক শেয়ার করতে ব্যবহৃত হয়। Service সাধারণত অ্যাপ্লিকেশনের এমন ডেটা বা কার্যকলাপ ধারণ করে যা একাধিক কম্পোনেন্ট, কন্ট্রোলার বা রাউটের মধ্যে শেয়ার করা প্রয়োজন।
Services একসাথে বিভিন্ন অংশের মধ্যে শেয়ারযোগ্য লজিক বা ডেটা সরবরাহ করে, যেমন: ইউজার অথেন্টিকেশন, API কল, সেশন ডেটা ইত্যাদি।
এখানে, আমরা Ember.js Services এর মাধ্যমে কিভাবে ডেটা শেয়ার করা যায়, তা ব্যাখ্যা করব।
Ember.js Services এর ভূমিকা
- স্টেট শেয়ারিং:
- Services ব্যবহার করে আপনি অ্যাপ্লিকেশনের বিভিন্ন অংশে একে অপরের সাথে স্টেট শেয়ার করতে পারেন। এক কম্পোনেন্টের মধ্যে পরিবর্তিত স্টেট অন্য কম্পোনেন্টে রিয়েল টাইমে পাওয়া যায়।
- শেয়ারযোগ্য লজিক:
- Services সাধারণত এমন লজিক ধারণ করে যা একাধিক স্থান থেকে ব্যবহৃত হয়। যেমন API কল, ইউজার অথেন্টিকেশন, অথবা লগিং মেকানিজম।
- ডেটা শেয়ারিং:
- বিভিন্ন রাউট, কন্ট্রোলার বা কম্পোনেন্টে ডেটা শেয়ার করতে Services ব্যবহার করা হয়, যা একটি নির্দিষ্ট Service থেকে অন্যান্য অংশে প্রবাহিত হয়।
Ember.js Service তৈরি করা
Ember CLI ব্যবহার করে একটি Service তৈরি করা যায়। উদাহরণস্বরূপ:
ember generate service user-session
এই কমান্ডটি দুটি ফাইল তৈরি করবে:
- app/services/user-session.js: এই ফাইলে service লজিক থাকবে।
- tests/unit/services/user-session-test.js: এই ফাইলটি service টেস্টের জন্য।
Service এর JavaScript কনফিগারেশন
Ember service ক্লাসটি @service ডেকোরেটর ব্যবহার করে তৈরি করা হয়। এখানে একটি উদাহরণ:
// app/services/user-session.js
import Service from '@ember/service';
export default class UserSessionService extends Service {
// Service এর মধ্যে ডেটা
isAuthenticated = false;
user = null;
// ডেটা সেট করার জন্য একটি মেথড
setUser(user) {
this.user = user;
this.isAuthenticated = true;
}
// ডেটা রিসেট করার জন্য একটি মেথড
logout() {
this.user = null;
this.isAuthenticated = false;
}
}
এখানে, UserSessionService একটি isAuthenticated ফ্ল্যাগ এবং user অবজেক্ট ধারণ করছে, যা ইউজারের লগইন স্টেট এবং তথ্য ধারণ করবে।
Service কে Inject করা
Ember.js-এ inject ব্যবহার করে কম্পোনেন্ট, কন্ট্রোলার বা রাউটে Service ইনজেক্ট করা হয়। উদাহরণস্বরূপ:
// app/components/user-profile.js
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
export default class UserProfileComponent extends Component {
// Service ইনজেক্ট করা
@service userSession;
get userName() {
return this.userSession.user ? this.userSession.user.name : 'Guest';
}
}
এখানে, @service userSession দিয়ে আমরা user-session Service কে কম্পোনেন্টে ইনজেক্ট করেছি এবং কম্পোনেন্টের মধ্যে ডেটা ব্যবহার করেছি। userName গেটারে আমরা userSession থেকে ইউজারের নাম নিয়ে এসেছি।
Service এবং Data Sharing
Services ডেটা শেয়ারিংয়ে গুরুত্বপূর্ণ ভূমিকা পালন করে, কারণ একবার Service এ ডেটা সেট করলে, সেই ডেটা অ্যাপ্লিকেশনের যে কোনো অংশে পাওয়া যেতে পারে যেখানে সেই Service ইনজেক্ট করা হয়েছে।
উদাহরণ: ইউজার সেশন শেয়ারিং
ধরা যাক, আমাদের একটি UserSessionService আছে, যেখানে লগইন স্টেট এবং ইউজারের তথ্য সংরক্ষিত থাকে। আমরা বিভিন্ন কম্পোনেন্ট বা রাউট থেকে এই ডেটা অ্যাক্সেস করতে পারি:
// app/routes/application.js
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
export default class ApplicationRoute extends Route {
@service userSession;
beforeModel() {
if (!this.userSession.isAuthenticated) {
this.transitionTo('login'); // লগিন না থাকলে রিডাইরেক্ট করবে
}
}
}
এখানে, ApplicationRoute রাউটে userSession Service ইনজেক্ট করা হয়েছে এবং beforeModel() মেথডের মাধ্যমে ইউজার যদি লগইন না করে থাকে, তবে তা login রাউটে রিডাইরেক্ট করবে।
কম্পোনেন্টে Service ব্যবহার
// app/components/user-profile.js
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
export default class UserProfileComponent extends Component {
@service userSession;
get userName() {
return this.userSession.user ? this.userSession.user.name : 'No User';
}
}
এখানে, userSession Service ইনজেক্ট করে কম্পোনেন্টে ব্যবহার করা হয়েছে।
Service এর উপকারিতা
- Global State Sharing: Service-এর মাধ্যমে একবার ডেটা সেট করলে তা অ্যাপ্লিকেশনের বিভিন্ন অংশে শেয়ার করা যায়।
- Single Source of Truth: Service এক ধরনের single source of truth হিসেবে কাজ করে। যেখানে ডেটা থাকে, সেখানে পরিবর্তন করলে সেই পরিবর্তন সব স্থানেই প্রতিফলিত হয়।
- Separation of Concerns: Service গুলি বিভিন্ন লজিক একত্রিত করে, যা কোডের বিভাজন এবং পুনঃব্যবহারযোগ্যতা বাড়ায়।
- Async Data Management: Service এর মাধ্যমে API কল বা ডেটার প্রসেসিং সহজে করা যায় এবং ডেটা সহজে শেয়ার করা যায়।
Ember.js Service এর কনফিগারেশন এবং ব্যবহার
Service Ember.js-এ ডেটা শেয়ার এবং ব্যবস্থাপনা করতে ব্যবহৃত হয়, এবং এটি অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে স্টেট শেয়ার করার জন্য আদর্শ। inject ডেকোরেটর ব্যবহার করে আপনি যে কোনো কম্পোনেন্ট, কন্ট্রোলার বা রাউটে Service ইনজেক্ট করে তা ব্যবহার করতে পারেন।
এভাবে, Ember.js Services ডেটা এবং লজিক শেয়ার করার জন্য একটি অত্যন্ত কার্যকরী এবং নমনীয় উপায় প্রদান করে, যা বড় এবং জটিল অ্যাপ্লিকেশন নির্মাণের জন্য অপরিহার্য।
Ember.js একটি শক্তিশালী ফ্রেমওয়ার্ক যা ডেভেলপারদের বড় এবং স্কেলেবল অ্যাপ্লিকেশন তৈরি করতে সহায়ক। এর মধ্যে Injected Properties এবং Singleton Services দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা অ্যাপ্লিকেশন স্থিতিশীলতা, কার্যকারিতা এবং পুনঃব্যবহারযোগ্যতার জন্য অত্যন্ত গুরুত্বপূর্ণ।
এই দুটি বৈশিষ্ট্যকে ব্যাখ্যা করতে চলুন:
Injected Properties
Injected Properties হল সেই প্রপার্টি যা একটি কম্পোনেন্ট, কন্ট্রোলার বা রাউটে অন্য একটি সার্ভিস বা কন্ট্রোলার থেকে ডিপেন্ডেন্সি ইনজেকশন (Dependency Injection) হিসেবে আনা হয়। এটি services বা অন্যান্য আবশ্যক ডেটাকে অ্যাপ্লিকেশন কোডে সহজেই প্রবাহিত করার একটি উপায়।
Ember.js-এ injection ব্যবহৃত হয় যখন একটি ক্লাস (যেমন কম্পোনেন্ট বা কন্ট্রোলার) অন্য কোনো ক্লাসের ডেটা বা কার্যকলাপের উপর নির্ভরশীল থাকে। ইনজেকশন প্রপার্টি সাধারণত @service ডেকোরেটর ব্যবহার করে ইনজেক্ট করা হয়।
Injected Properties উদাহরণ
- Service তৈরি করা
এখানে একটি user-authentication সার্ভিস তৈরি করা হয়েছে যা অ্যাপ্লিকেশনের লগইন স্টেট পরিচালনা করে:
// app/services/user-authentication.js
import Service from '@ember/service';
export default class UserAuthenticationService extends Service {
isAuthenticated = false;
login() {
this.isAuthenticated = true;
}
logout() {
this.isAuthenticated = false;
}
}
- Service Inject করা
এখন, এই সার্ভিসটি একটি component বা controller-এ ইনজেক্ট করা হবে:
// app/components/login-button.js
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
export default class LoginButtonComponent extends Component {
@service userAuthentication;
get loginStatus() {
return this.userAuthentication.isAuthenticated ? 'Logged in' : 'Logged out';
}
login() {
this.userAuthentication.login();
}
logout() {
this.userAuthentication.logout();
}
}
এখানে, @service ডেকোরেটরটি ব্যবহার করা হয়েছে, যা userAuthentication সার্ভিসকে এই কম্পোনেন্টে ইনজেক্ট করেছে। এর ফলে, login এবং logout মেথডগুলো এই সার্ভিস ব্যবহার করতে সক্ষম হয়েছে।
- টেমপ্লেটের মাধ্যমে ব্যবহার
<!-- app/templates/components/login-button.hbs -->
<button {{on "click" this.login}}>Login</button>
<button {{on "click" this.logout}}>Logout</button>
<p>Status: {{this.loginStatus}}</p>
এই টেমপ্লেটটি ব্যবহারকারীকে লগইন এবং লগআউট করার জন্য বাটন প্রদর্শন করে, এবং লগইন স্ট্যাটাস দেখায়।
Singleton Services
Singleton Services হল এমন একটি সার্ভিস যা অ্যাপ্লিকেশনে একক এক্সেমপ্লার (instance) তৈরি করে এবং সার্ভিসটি পুরো অ্যাপ্লিকেশন জুড়ে ব্যবহৃত হয়। এই সার্ভিসটি অ্যাপ্লিকেশন চলাকালীন একটিই থাকে, এবং এটি নির্দিষ্ট অবস্থা বা ডেটা এক্সেস করতে ব্যবহৃত হয়।
Ember.js-এর services সাধারণত singleton হিসেবে কাজ করে। এর মানে হল যে, একবার একটি সার্ভিস ইনজেক্ট করলে, তা অ্যাপ্লিকেশনের সমস্ত অংশের মধ্যে পুনঃব্যবহারযোগ্য হয়ে ওঠে।
Singleton Service উদাহরণ
- Singleton Service তৈরি করা
// app/services/logger.js
import Service from '@ember/service';
export default class LoggerService extends Service {
log(message) {
console.log(message);
}
}
এটি একটি খুব সাধারণ logger সার্ভিস, যা অ্যাপ্লিকেশনের যেকোনো অংশে লগ বার্তা পাঠাতে ব্যবহৃত হবে।
- Singleton Service Inject করা
এখন, এই logger সার্ভিসটি অন্যান্য কম্পোনেন্ট বা কন্ট্রোলারগুলিতে ইনজেক্ট করা যাবে:
// app/components/app-header.js
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
export default class AppHeaderComponent extends Component {
@service logger;
constructor() {
super(...arguments);
this.logger.log('AppHeader component initialized');
}
}
এখানে, logger সার্ভিসটি ইনজেক্ট করা হয়েছে এবং এটি কম্পোনেন্টের constructor মেথডে ব্যবহৃত হয়েছে।
- টেমপ্লেটের মাধ্যমে ব্যবহৃত না হলেও সার্ভিসের কার্যকলাপ
<!-- app/templates/components/app-header.hbs -->
<h1>Welcome to the App</h1>
এখানে, টেমপ্লেটটি শুধুমাত্র একটি সাধারণ শিরোনাম প্রদর্শন করবে, তবে লগিং কার্যকলাপের জন্য logger সার্ভিসটি পেছনে কাজ করছে।
Ember.js Services এবং Injected Properties এর সুবিধা
- Code Reusability: একটি service একবার তৈরি করলে, এটি অ্যাপ্লিকেশনের যেকোনো অংশে পুনঃব্যবহার করা যায়।
- Data Sharing: একাধিক কম্পোনেন্ট বা কন্ট্রোলারগুলির মধ্যে ডেটা শেয়ার করতে injected properties ব্যবহার করা যেতে পারে। এতে ডেটা একসাথে সিঙ্ক্রোনাইজ করা সহজ হয়।
- Centralized State Management: services অ্যাপ্লিকেশনের কেন্দ্রীয় অবস্থান বা স্টেট পরিচালনা করতে ব্যবহৃত হয়, যেমন ব্যবহারকারী অথেন্টিকেশন, লগিং, অথবা অ্যাপ্লিকেশন কনফিগারেশন।
- Singleton Pattern: services সাধারণত singleton প্যাটার্নে কাজ করে, যার ফলে সার্ভিসের একক এক্সেমপ্লার অ্যাপ্লিকেশন জুড়ে একযোগে ব্যবহৃত হয়।
Injected Properties এবং Singleton Services Ember.js অ্যাপ্লিকেশন ডেভেলপমেন্টে অত্যন্ত গুরুত্বপূর্ণ। Injected Properties দিয়ে সার্ভিস বা অন্যান্য ডেটা কম্পোনেন্টে ইনজেক্ট করা যায়, যা ডেটা শেয়ার এবং ব্যবহার করতে সহায়ক। অন্যদিকে, Singleton Services অ্যাপ্লিকেশন জুড়ে একক এক্সেমপ্লার হিসেবে ব্যবহৃত হয় এবং একাধিক কম্পোনেন্ট বা কন্ট্রোলারের মধ্যে স্থিতিশীল ডেটা শেয়ার করে। এই দুটি বৈশিষ্ট্য কোডের পুনঃব্যবহারযোগ্যতা, সহজ ডেটা ম্যানেজমেন্ট এবং কার্যকরী অ্যাপ্লিকেশন নির্মাণের জন্য অত্যন্ত কার্যকরী।
Read more